﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Entity;
using Business;
using System.Threading;

namespace CPEBookWeb
{
    public partial class Profil : System.Web.UI.Page
    {
        /// <summary>
        /// L'utilisateur loggé.
        /// </summary>
        private Utilisateur utilisateur;

        /// <summary>
        /// L'utilisateur à afficher
        /// </summary>
        private Utilisateur profil;

        /// <summary>
        /// Indique si l'utilisateur qui consulte le profil en est le propriétaire.
        /// </summary>
        private bool consulteSaPage = false;


        /// <summary>
        /// Appelée au chargement de la page.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            // On vérifie qu'un utilisateur est loggé
            utilisateur = (Utilisateur)Session["Utilisateur"];
            if (utilisateur == null)
            {
                Response.Redirect("Default.aspx");
            }

            // On vérifie qu'un identifiant correct est passé en argument
            int id = -1;
            String idGet = Request.Params.Get("id");
            if (idGet == null || !Int32.TryParse(idGet, out id))
            {
                Response.Redirect("Mur.aspx");
            }

            // On regarde si l'utilisateur existe
            profil = UtilisateurService.getUtilisateur(id);
            if (profil == null)
            {
                Response.Redirect("Mur.aspx");
            }

            // On regarde si l'utilisateur à le droit de consulter cette page
            if (!DroitsService.estAmisAvec(utilisateur, profil.idutilisateur))
            {
                Response.Redirect("Apercu.aspx?id=" + profil.idutilisateur);
            }

            // On regarde si l'utilisateur est le propriétaire de la page
            consulteSaPage = (profil.idutilisateur == utilisateur.idutilisateur);

            // On renseigne la page avec les données en session
            lienBarreProfil.NavigateUrl = "Profil.aspx?id=" + utilisateur.idutilisateur;
            lienConsulterProfil.Text = utilisateur.prenom + " " + utilisateur.nom;
            lienConsulterProfil.NavigateUrl = "Profil.aspx?id=" + utilisateur.idutilisateur;
            lienModifierProfil.NavigateUrl = "Editer.aspx";

            h1PrenomNom.Text = profil.prenom + " " + profil.nom;
            infoAge.Text = Outils.calculerAge(profil.datenaissance).ToString();
            infoFilliere.Text = profil.filliere;
            infoPromotion.Text = profil.promotion.ToString();
            infoSexe.Text = (profil.sexe == Sexe.MASCULIN) ? "masculin" : "féminin";
            lienEmail.Text = profil.email;
            lienEmail.NavigateUrl = "mailto:" + profil.email;

            listeAmisPrenom.Text = profil.prenom;

            // Elements spécifiques si l'utilisateur est sur sa propre page
            if (consulteSaPage)
            {

                // On donne la possibilité d'ajout un statut
                Panel panelAjoutStatut = (Panel)Page.FindControl("panelAjoutStatut");

                Label labelAjout = new Label();
                labelAjout.CssClass = "murExprimezVous";
                labelAjout.Text = "Exprimez vous : ";

                TextBox tbAjout = new TextBox();
                tbAjout.ID = "tbStatut";
                tbAjout.CssClass = "murTbStatut";

                Button btnAjout = new Button();
                btnAjout.ID = "btnAjoutStatut";
                btnAjout.Click += new EventHandler(btnAjoutStatut_Click);
                btnAjout.Text = "Ajouter";

                panelAjoutStatut.Controls.Add(labelAjout);
                panelAjoutStatut.Controls.Add(tbAjout);
                panelAjoutStatut.Controls.Add(btnAjout);

                // Bouton d'action
                Panel panelModifier = (Panel)Page.FindControl("profilbtnmodifier");
                
                Button btnModifier = new Button();
                btnModifier.ID = "btnModifier";
                btnModifier.Click += new EventHandler(btnModifier_Click);
                btnModifier.Text = "Modifier mon profil";

                panelModifier.Controls.Add(btnModifier);
            }

            // On affiche les demandes d'amis
            rafraichirDemandes();

            // On affiche les liste des amis
            rafraichirAmis();

            // On affiche le fil d'actualité
            rafraichirActualites();
        }


        /// <summary>
        /// Methode permettant d'ajouter au panel du profil les statuts du profil
        /// </summary>
        private void rafraichirActualites()
        {
            // On récupère le panel destiné à accueillir les actualités
            Panel panel = (Panel)Page.FindControl("panelActualites");

            // On efface tout le contenu
            panel.Controls.Clear();

            // On récupère toutes les actualités à afficher
            List<Actualite> listActualites = ActualiteService.getActualitesDuProfil(profil.idutilisateur);

            if (listActualites != null)
            {
                // On boucle sur chaque actualité
                foreach (Actualite actualite in listActualites)
                {
                    // On appele le composant générateur de code
                    ActualiteView actualiteView = new ActualiteView
                    {
                        Actualite = actualite,
                        Utilisateur = utilisateur,
                        EcouteurJaime = new EventHandler(linkBtnJaime_Click),
                        EcouteurCommenter = new EventHandler(btnComment_Click),
                    };
                    Table tableActualite = actualiteView.getTableActualite();

                    if (consulteSaPage)
                    {
                        // On génère l'en-tête permettant de supprimer l'actualité
                        Button btnSupprimer = new Button();
                        btnSupprimer.ID = "BtnSupprimer_" + actualite.Statut.idstatut.ToString();
                        btnSupprimer.CommandName = "supprimer";
                        btnSupprimer.CommandArgument = actualite.Statut.idstatut.ToString();
                        btnSupprimer.Click += new EventHandler(btnSupprimer_Click);
                        btnSupprimer.Text = "Supprimer cette actualité";
                        btnSupprimer.CssClass = "btnsupprimer";

                        Panel barreSuppression = new Panel();
                        barreSuppression.CssClass = "supprimeractualite";
                        barreSuppression.Controls.Add(btnSupprimer);

                        panel.Controls.Add(barreSuppression);
                    }

                    // On ajoute la table
                    panel.Controls.Add(tableActualite);
                }
            }
        }


        /// <summary>
        /// Methode permettant d'ajouter au panel des demandes les demandes d'amis.
        /// </summary>
        private void rafraichirDemandes()
        {
            // On récupère le panel destiné à accueillir les demandes d'amis
            Panel panel = (Panel)Page.FindControl("panelDemandes");

            // On efface tout le contenu
            panel.Controls.Clear();

            // On récupère toutes les demandes d'ajouts à afficher
            List<AmitieUtilisateur> listDemandes = AmisService.getDemandeAjout(utilisateur.idutilisateur);

            if (listDemandes != null)
            {
                // On appele le composant générateur de code
                DemandesAjoutView demandeAjoutView = new DemandesAjoutView
                {
                    Demandes = listDemandes,
                    EcouteurDecision = new EventHandler(btnAccepterOuIgnorer_Click)
                };
                Panel tableDemandes = demandeAjoutView.getTableDemandes();

                // On ajoute la table
                panel.Controls.Add(tableDemandes);
            }
        }


        /// <summary>
        /// Methode permettant d'ajouter au panel des amis la liste d'amis.
        /// </summary>
        private void rafraichirAmis()
        {
            // On récupère le panel destiné à accueillir les demandes d'amis
            Panel panel = (Panel)Page.FindControl("panelAmis");

            // On efface tout le contenu
            panel.Controls.Clear();

            // On récupère toutes les demandes d'ajouts à afficher
            List<AmitieUtilisateur> listAmis = AmisService.getAmities(profil.idutilisateur);

            // On appele le composant générateur de code
            AmisView amisView = new AmisView { Amis = listAmis };
            Panel tableAmis = amisView.getTableDemandes();

            // On ajoute la table
            panel.Controls.Add(tableAmis);
        }


        /// <summary>
        /// Evenement appelé lors d'un clic sur "Modifier mon profil"
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnModifier_Click(object sender, EventArgs e)
        {
            // Opération possible que si l'utilisateur est sur sa propre page
            if (consulteSaPage)
            {
                // Le champs à été créé dans le code, on doit le retrouver ainsi
                Response.Redirect("Editer.aspx?id=" + utilisateur.idutilisateur);
            }
        }


        /// <summary>
        /// Evenement appelé au moment de l'envoi d'un commentaire
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void btnComment_Click(object sender, EventArgs e)
        {
            // On patiente pour afficher le "Patienter" au professeur.
            //Thread.Sleep(500);

            // On récupère le bouton à la source de l'évennement
            Button btnSource = (Button)sender;

            // On regarde qu'il s'agisse bien de la bonne commande
            if (btnSource.CommandName == "commenter")
            {
                // On récupère l'identifiant
                int idstatut = -1;
                if (Int32.TryParse(btnSource.CommandArgument, out idstatut))
                {
                    // On cherche le champs de texte associé à l'id
                    TextBox textBox = (TextBox)Page.FindControl("TextCommentStatut_" + idstatut.ToString());

                    // S'il est non vide on ajoute un commentaire
                    if (textBox != null && textBox.Text != "")
                        ActualiteService.ajouterCommentaire(idstatut, utilisateur.idutilisateur, textBox.Text, DateTime.Now);

                    // On met à jour le fil d'actu
                    rafraichirActualites();
                }
            }
        }


        /// <summary>
        /// Evenement appelé au moment d'un click sur un bouton j'aime
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void linkBtnJaime_Click(object sender, EventArgs e)
        {
            // On récupère le lien à la source de l'évennement
            LinkButton lienSource = (LinkButton)sender;

            // On regarde qu'il s'agisse bien de la bonne commande
            if (lienSource.CommandName == "aimer")
            {
                // On récupère l'identifiant
                int idstatut = -1;
                if (Int32.TryParse(lienSource.CommandArgument, out idstatut))
                {
                    // On prends en compte le "J'aime"
                    ActualiteService.aimer(idstatut, utilisateur.idutilisateur);

                    // On met à jour le fil d'actu
                    rafraichirActualites();
                }
            }
        }


        /// <summary>
        /// Evenement appelé au moment de l'ajout d'un nouveau statut
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnAjoutStatut_Click(object sender, EventArgs e)
        {
            // Opération possible que si l'utilisateur est sur sa propre page
            if (consulteSaPage)
            {
                // Le champs à été créé dans le code, on doit le retrouver ainsi
                TextBox tbStatut = (TextBox)Page.FindControl("tbStatut");

                // On ajoute pas si null ou vide
                if (tbStatut != null && tbStatut.Text != "")
                {
                    // On ajoute l'actualité
                    ActualiteService.ajouterActualite(utilisateur.idutilisateur, tbStatut.Text, DateTime.Now);

                    // On met à jour le fil d'actu
                    rafraichirActualites();
                }

                // Dans tous les cas on réinitialise le champs
                tbStatut.Text = "";
            }
        }


        /// <summary>
        /// Evenement appelé lors d'un clic sur un bouton "Supprimer"
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnSupprimer_Click(object sender, EventArgs e)
        {
            // Opération possible que si l'utilisateur est sur sa propre page
            if (consulteSaPage)
            {
                // On récupère le lien à la source de l'évennement
                Button btnSource = (Button)sender;

                // On regarde qu'il s'agisse bien de la bonne commande
                if (btnSource.CommandName == "supprimer")
                {
                    // On récupère l'identifiant
                    int idstatut = -1;
                    if (Int32.TryParse(btnSource.CommandArgument, out idstatut))
                    {
                        // On supprime
                        ActualiteService.supprimerActualite(idstatut);

                        // On met à jour le fil d'actu
                        rafraichirActualites();
                    }
                }
            }
        }


        /// <summary>
        /// Evenement appelé lors d'un clic sur "Ajouter" ou "Accepter".
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnAccepterOuIgnorer_Click(object sender, EventArgs e)
        {
            // On récupère le bouton à la source de l'évennement
            Button btnSource = (Button)sender;

            // On vérifie que la commande est valide
            if (btnSource.CommandName == "accepter" || btnSource.CommandName == "ignorer")
            {
                // On récupère l'identifiant
                int iddemandeur = -1;
                if (Int32.TryParse(btnSource.CommandArgument, out iddemandeur))
                {
                    // On traite en fonction de la réponse
                    if (btnSource.CommandName == "accepter")
                    {
                        AmisService.confirmerDemande(iddemandeur, utilisateur.idutilisateur);

                        // Après ajout on va sur la page du demandeur
                        Response.Redirect("Profil.aspx?id=" + iddemandeur.ToString());
                    }
                    else
                    {
                        AmisService.ignorerDemande(iddemandeur, utilisateur.idutilisateur);
                    }

                    // On met à jour la liste des demandes
                    rafraichirDemandes();
                }
            }
        }


        /// <summary>
        /// Evenement appelé lors d'un clic sur "Rechercher".
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void rechercheBouton_Click(object sender, EventArgs e)
        {
            Response.Redirect("Recherche.aspx?r=" + rechercheInput.Text);
        }

    }
}